package com.lqk.demo.jmm.exercise;

import java.io.Serializable;

/**
 * @author lqk
 * @date 2021/12/28 20:00
 */
// 问题1：为什么加 final: 防止子类继承后修改其方法，从而破坏单例模式
// 问题2：如果实现了序列化接口, 还要做什么来防止反序列化破坏单例
public final class Singleton1 implements Serializable {
    // 问题3：为什么设置为私有? 是否能防止反射创建新的实例?
    // 设置私有防止new 出来新的对象，不能防止反射创建新的实例
    private Singleton1() {}
    // 问题4：这样初始化是否能保证单例对象创建时的线程安全?：是的，这是饿汉式，在类加载过程中赋值静态变量是线程安全的
    private static final Singleton1 INSTANCE = new Singleton1();
    // 问题5：为什么提供静态方法而不是直接将 INSTANCE 设置为 public, 说出你知道的理由
    public static Singleton1 getInstance() {
        return INSTANCE;
    }

    // 该方法用于防止反序列化生成新的对象，反序列化过程中，一旦发现有readResolve方法，就会返回该方法的返回值
    public Object readResolve() {
        return INSTANCE;
    }
}
